package com.generator.mybatis.generator.core.service.impl;

import com.generator.mybatis.generator.core.service.BaseService;
import org.apache.ibatis.session.RowBounds;
import tk.mybatis.mapper.common.Mapper;
import tk.mybatis.mapper.entity.Example;

import java.util.List;

/**
 * service层基类
 * @author zouhao
 * @param <T>
 */
public abstract class BaseServiceImpl<T> implements BaseService<T> {
	/**
	 * 根据实体中的属性进行查询，只能有一个返回值，有多个结果是抛出异常，查询条件使用等号
	 * @param t
	 * @return
	 */
	public T selectOne(T t){
		return this.getDao().selectOne(t);
	}
	/**
	 * 根据实体中的属性值进行查询，查询条件使用等号
	 * @param t
	 * @return
	 */
	public List<T> select(T t){
		return this.getDao().select(t);
	}
	/**
	 * 根据实体属性和RowBounds进行分页查询
	 */
	public List<T> selectByPage(T t,int page,int pageSize){
		return this.getDao().selectByRowBounds(t, new RowBounds((page-1)*pageSize,pageSize));
	}
	/**
	 * 查询全部结果
	 * @return
	 */
	public List<T> selectAll(){
		return this.getDao().selectAll();
	}
	/**
	 * 使用自定义条件查询全部结果
	 * @return
	 */
	public List<T> selectByExample( Example  example){
		return this.getDao().selectByExample(example);
	}

	public List<T> selectByExampleAndRowBounds( Example  example,int page,int pageSize){
		return this.getDao().selectByExampleAndRowBounds(example, new RowBounds((page-1)*pageSize,pageSize));
	}
	/**
	 * 根据主键字段进行查询，方法参数必须包含完整的主键属性，查询条件使用等号
	 * @param key
	 * @return
	 */
	public T selectByPrimaryKey(Object key){
		return this.getDao().selectByPrimaryKey(key);
	}
	/**
	 * 根据主键字段进行删除，方法参数必须包含完整的主键属性
	 * @param key
	 * @return
	 * @throws Exception 
	 */
	public int deleteByPrimaryKey(Object key) throws Exception{
		try{
			return this.getDao().deleteByPrimaryKey(key);
		}catch(Exception e){
			throw new Exception("删除失败");
		}
	}
	/**
	 * 根据Example条件删除数据
	 * @param example
	 * @return
	 */
	public int deleteByExample(Object example) throws Exception{
		try{
			return this.getDao().deleteByExample(example);
		}catch(Exception e){
			throw new Exception("删除失败");
		}
	}
	/**
	 * 保存一个实体，null的属性也会保存，不会使用数据库默认值
	 * @param t
	 * @return
	 */
	public int insert(T t) throws Exception{
		try{
			return this.getDao().insert(t);
		}catch(Exception e){
			e.printStackTrace();
			throw new Exception("插入失败");
		}
		
	}
	/**
	 * 保存一个实体，null的属性不会保存，会使用数据库默认值
	 * @param t
	 * @return
	 */
	public int insertSelective(T t) throws Exception{
		try{
			return this.getDao().insertSelective(t);
		}catch(Exception e){
			throw new Exception("插入失败");
		}
	}
	/**
	 * 根据条件查询总数
	 * @param t
	 * @return
	 */
	public int selectCount(T t){
		return this.getDao().selectCount(t);
	}
	public int selectCountByExample(Example example){
		return this.getDao().selectCountByExample(example);
	}
	/**
	 * 根据主键更新实体全部字段，null值会被更新
	 * @param t
	 * @return
	 */
	public int updateByPrimaryKey(T t) throws Exception{
		try{
			return this.getDao().updateByPrimaryKey(t);
		}catch(Exception e){
			throw new Exception("更新失败");
		}
	}
	/**
	 * 根据主键更新属性不为null的值
	 * @param t
	 * @return
	 */
	public int updateByPrimaryKeySelective(T t) throws Exception{
		try{
			return this.getDao().updateByPrimaryKeySelective(t);
		}catch(Exception e){
			throw new Exception("更新失败");
		}
		
	}
	/**
	 * 根据Example条件更新实体`record`包含的全部属性，null值会被更新
	 * @param t
	 * @param example
	 * @return
	 */
	public int updateByExample(T record, Object example) throws Exception{
		try{
			return this.getDao().updateByExample(record, example);
		}catch(Exception e){
			throw new Exception("更新失败");
		}
	}
	/**
	 * 根据Example条件更新实体`record`包含的不是null的属性值
	 * @param record
	 * @param example
	 * @return
	 */
	public int updateByExampleSelective(T record, Object example) throws Exception{
		try{
			return this.getDao().updateByExampleSelective(record, example);
		}catch(Exception e){
			throw new Exception("更新失败");
		}
	}
	protected abstract  Mapper<T> getDao();
}
